package com.ruoyi.common.utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import cn.hutool.core.lang.Assert;
import lombok.extern.slf4j.Slf4j;

/**
 *  1元 = 10角 = 100分
 *  说明：元转换为分,分转换为元
 *  @author:heshengjin qq:2356899074
 *  @date 2020年11月26日 下午1:17:12
 */
@Slf4j
public final class YuanJiaoFenUtils {

	/**
	 * 进率：
	 * 1元 = 10角
	 * 1角 = 10分
	 */
	public final static BigDecimal GAP_OF_YUAN_JIAO_FEN = new BigDecimal("10");
	/**
	 * 检查消息提示
	 */
	public final static String TIPMESSAGE = "请检查参数，方法：{}，参数：{}不能为空！";

	/**
	 * 参数：BigDecimal【强制使用字符串创建】,eg:new BigDecimal("1")
	 * 元转换为角
	 * 小数位：scale
	 * 默认ROUND_UP 进位处理：2.224667->2.23
	 *  @author:heshengjin qq:2356899074
	    @date 2020年11月26日 下午1:32:08
	 */
	public static BigDecimal yuanToJiao(BigDecimal yuan) {
		Assert.notNull(yuan, TIPMESSAGE, "yuanToJiao","yuan");
		return yuan.multiply(GAP_OF_YUAN_JIAO_FEN);
	}

	/**
	 * 参数：BigDecimal【强制使用字符串创建】,eg:new BigDecimal("1")
	 * 元转换为分
	 * 小数位：scale
	 * 默认ROUND_UP 进位处理：2.224667->2.23
	 *  @author:heshengjin qq:2356899074
	    @date 2020年11月26日 下午1:21:25
	 */
	public static BigDecimal yuanToFen(BigDecimal yuan) {
		Assert.notNull(yuan, TIPMESSAGE, "yuanToFen","yuan");
		return jiaoToFen(yuanToJiao(yuan));
	}

	/**
	 * 参数：BigDecimal【强制使用字符串创建】,eg:new BigDecimal("1")
	 * 角转换为元
	 * 小数位：scale
	 * 默认ROUND_UP 进位处理：2.224667->2.23
	 *  @author:heshengjin qq:2356899074
	    @date 2020年11月26日 下午1:20:55
	 */
	public static BigDecimal jiaoToYuan(BigDecimal jiao) {
		Assert.notNull(jiao, TIPMESSAGE, "jiaoToYuan","jiao");
		return jiao.divide(GAP_OF_YUAN_JIAO_FEN);
	}

	/**
	 * 参数：BigDecimal【强制使用字符串创建】,eg:new BigDecimal("1")
	 * 角转换为分
	 * 小数位：scale
	 * 默认ROUND_UP 进位处理：2.224667->2.23
	 *  @author:heshengjin qq:2356899074
	    @date 2020年11月26日 下午1:20:55
	 */
	public static BigDecimal jiaoToFen(BigDecimal jiao) {
		Assert.notNull(jiao, TIPMESSAGE, "jiaoToFen","jiao");
		return jiao.multiply(GAP_OF_YUAN_JIAO_FEN);
	}

	/**
	 * 参数：BigDecimal【强制使用字符串创建】,eg:new BigDecimal("1")
	 * 分转换为角
	 * 小数位：scale
	 * 默认ROUND_UP 进位处理：2.224667->2.23
	 *  @author:heshengjin qq:2356899074
	    @date 2020年11月26日 下午1:20:55
	 */
	public static BigDecimal fenToJiao(BigDecimal fen) {
		Assert.notNull(fen, TIPMESSAGE, "fenToJiao","fen");
		return fen.divide(GAP_OF_YUAN_JIAO_FEN);
	}

	/**
	 * 参数：BigDecimal【强制使用字符串创建】,eg:new BigDecimal("1")
	 * 分转换为元
	 * 小数位：scale
	 * 默认ROUND_UP 进位处理：2.224667->2.23
	 *  @author:heshengjin qq:2356899074
	    @date 2020年11月26日 下午1:20:55
	 */
	public static BigDecimal fenToYuan(BigDecimal fen) {
		Assert.notNull(fen, TIPMESSAGE, "fenToYuan","fen");
		return jiaoToYuan(fenToJiao(fen));
	}

    /**
     * 金额去后面0
     * Author：William（徐威）
     * Create Time：2018-07-25
     *
     * @param money
     * @return
     */
    public static BigDecimal removeAmtLastZero(BigDecimal money) {
        String strMoney = money.toString();
        if (strMoney.indexOf('.') != -1) {
            String[] arr = strMoney.split("\\.");
            String strDecimals = arr[1];
            List<String> list = new ArrayList<String>();
            boolean isCanAdd = false;
            for (int i = strDecimals.length() - 1; i > -1; i--) {
                String ss = String.valueOf(strDecimals.charAt(i));
                if (!ss.equals("0")) {
                    isCanAdd = true;//从最后的字符开始算起，遇到第一个不是0的字符开始都是需要保留的字符
                }
                if (!ss.equals("0") || isCanAdd) {
                    list.add(ss);
                }
            }
            StringBuffer strZero = new StringBuffer();
            for (int i = list.size() - 1; i > -1; i--) {
                strZero.append(list.get(i));
            }
            strMoney = String.format("%s.%s", arr[0], strZero.toString());
        }

        return new BigDecimal(strMoney);
    }

	/**
	 * 测试
	 *  @author:heshengjin qq:2356899074
	    @date 2020年11月26日 下午1:41:21
	 */
	public static void main(String[] args) {
		log.info("测试1.11元转分，转换结果：{} 分",removeAmtLastZero(yuanToFen(new BigDecimal("0.01"))));
		log.info("测试111.00分转元，转换结果：{} 元",fenToYuan(new BigDecimal("111.00")));
	}
}

